package com.ruoyi.merchant.task.scheduler;

import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.merchant.service.impl.ActivityServiceImpl;
import com.ruoyi.merchant.task.ActivityTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Set;

@Component
@Slf4j
public class ActivityTaskScheduler {

    @Autowired
    private RedisService redisService;

    @Autowired
    private ActivityServiceImpl activityService; // 假设的活动服务

    // 每5秒执行一次（可根据需求调整）
    @Scheduled(fixedRate = 5000)
    public void processActivityTasks() {
        // 1. 获取当前时间戳（秒）
        long now = System.currentTimeMillis() / 1000;

        // 2. 查询到期任务（score <= 当前时间）
        Set<Object> tasks = redisService.zRangeByScore(
                "activity:tasks", 0, now
        );

        // 3. 处理每个任务
        for (Object taskObj : tasks) {
            // 4. 任务数据反序列化
            ActivityTask task = JSON.parseObject(taskObj.toString(), ActivityTask.class);

            try {
                // 5. 根据任务类型执行操作
                if ("publish".equals(task.getType())) {
                    activityService.publishActivity(task.getActivityId());
                    System.out.println("活动发布啦！");
                } else if ("down".equals(task.getType())) {
                    activityService.downActivity(task.getActivityId());
                    System.out.println("活动下架啦！");
                }

                // 6. 删除已完成任务
                redisService.zRem("activity:tasks", taskObj);
            } catch (Exception e) {
                // 错误处理（重试机制）
                handleTaskFailure(task, e);
            }
        }
    }

    private void handleTaskFailure(ActivityTask task, Exception e) {
        // 重试逻辑（示例：最多重试3次）
        if (task.getRetryCount() < 3) {
            task.setRetryCount(task.getRetryCount() + 1);
            // 5分钟后重试
            double newScore = (System.currentTimeMillis() / 1000) + 300;
            redisService.zAdd("activity:tasks", JSON.toJSONString(task), newScore);
        } else {
            // 记录失败任务
            log.error("活动任务处理失败: {}", task, e);
        }
    }
}
